home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 1.5)
-
- import regex
- import string
- incomplete = regex.compile('<!-?\\|</[a-zA-Z][a-zA-Z0-9]*[ \t\n]*\\|</?\\|' + '[a-zA-Z0-9]*\\|&[a-zA-Z][a-zA-Z0-9]*\\|&')
- entityref = regex.compile('&[a-zA-Z][a-zA-Z0-9]*[;.]')
- charref = regex.compile('[a-zA-Z0-9]+;')
- starttagopen = regex.compile('<[a-zA-Z]')
- endtag = regex.compile('</[a-zA-Z][a-zA-Z0-9]*[ \t\n]*>')
- commentopen = regex.compile('<!--')
-
- class SGMLParser:
-
- def __init__(self):
- self.reset()
-
-
- def reset(self):
- self.rawdata = ''
- self.stack = []
- self.nomoretags = 0
- self.literal = 0
-
-
- def setnomoretags(self):
- self.nomoretags = self.literal = 1
-
-
- def setliteral(self, *args):
- self.literal = 1
-
-
- def feed(self, data):
- self.rawdata = self.rawdata + data
- self.goahead(0)
-
-
- def close(self):
- self.goahead(1)
-
-
- def goahead(self, end):
- rawdata = self.rawdata
- i = 0
- n = len(rawdata)
- while i < n:
- if self.nomoretags:
- self.handle_data(rawdata[i:n])
- i = n
- break
-
- j = incomplete.search(rawdata, i)
- if j < 0:
- j = n
-
- if i < j:
- self.handle_data(rawdata[i:j])
-
- i = j
- if i == n:
- break
-
- if rawdata[i] == '<':
- if starttagopen.match(rawdata, i) >= 0:
- if self.literal:
- self.handle_data(rawdata[i])
- i = i + 1
- continue
-
- k = self.parse_starttag(i)
- if k < 0:
- break
-
- i = i + k
- continue
-
- k = endtag.match(rawdata, i)
- if k >= 0:
- j = i + k
- self.parse_endtag(rawdata[i:j])
- i = j
- self.literal = 0
- continue
-
- if commentopen.match(rawdata, i) >= 0:
- if self.literal:
- self.handle_data(rawdata[i])
- i = i + 1
- continue
-
- k = self.parse_comment(i)
- if k < 0:
- break
-
- i = i + k
- continue
-
- elif rawdata[i] == '&':
- k = charref.match(rawdata, i)
- if k >= 0:
- j = i + k
- self.handle_charref(rawdata[i + 2:j - 1])
- i = j
- continue
-
- k = entityref.match(rawdata, i)
- if k >= 0:
- j = i + k
- self.handle_entityref(rawdata[i + 1:j - 1])
- i = j
- continue
-
- else:
- raise RuntimeError, 'neither < nor & ??'
- k = incomplete.match(rawdata, i)
- if k < 0:
- raise RuntimeError, 'no incomplete match ??'
-
- j = i + k
- if j == n:
- break
-
- self.handle_data(rawdata[i:j])
- i = j
- if end and i < n:
- self.handle_data(rawdata[i:n])
- i = n
-
- self.rawdata = rawdata[i:]
-
-
- def parse_comment(self, i):
- rawdata = self.rawdata
- if rawdata[i:i + 4] != '<!--':
- raise RuntimeError, 'unexpected call to handle_comment'
-
-
- try:
- j = string.index(rawdata, '--', i + 4)
- except string.index_error:
- return -1
-
- self.handle_comment(rawdata[i + 4:j])
- j = j + 2
- n = len(rawdata)
- while j < n and rawdata[j] in ' \t\n':
- j = j + 1
- if j == n:
- return -1
-
- if rawdata[j] == '>':
- j = j + 1
- else:
- print '*** comment not terminated with >'
- print repr(rawdata[j - 5:j]), '*!*', repr(rawdata[j:j + 5])
- return j - i
-
-
- def parse_starttag(self, i):
- rawdata = self.rawdata
-
- try:
- j = string.index(rawdata, '>', i)
- except string.index_error:
- return -1
-
- attrs = []
- tagfind = regex.compile('[a-zA-Z][a-zA-Z0-9]*')
- attrfind = regex.compile('[ \t\n]+\\([a-zA-Z][a-zA-Z0-9]*\\)' + '\\([ \t\n]*=[ \t\n]*' + '\\(\'[^\']*\';\\|"[^"]*"\\|[-a-zA-Z0-9./:+*%?!()_#]+\\)\\)?')
- k = tagfind.match(rawdata, i + 1)
- if k < 0:
- raise RuntimeError, 'unexpected call to parse_starttag'
-
- k = i + 1 + k
- tag = string.lower(rawdata[i + 1:k])
- while k < j:
- l = attrfind.match(rawdata, k)
- if l < 0:
- break
-
- regs = attrfind.regs
- (a1, b1) = regs[1]
- (a2, b2) = regs[2]
- (a3, b3) = regs[3]
- attrname = rawdata[a1:b1]
- if '=' in rawdata[k:k + l]:
- attrvalue = rawdata[a3:b3]
- if "'" == "'":
- pass
- elif not "'" == attrvalue[-1:]:
- if '"' == '"':
- pass
- elif '"' == attrvalue[-1:]:
- attrvalue = attrvalue[1:-1]
-
- else:
- attrvalue = ''
- attrs.append(string.lower(attrname), attrvalue)
- k = k + l
- j = j + 1
-
- try:
- method = getattr(self, 'start_' + tag)
- except AttributeError:
-
- try:
- method = getattr(self, 'do_' + tag)
- except AttributeError:
- self.unknown_starttag(tag, attrs)
- return j - i
-
- method(attrs)
- return j - i
-
- self.stack.append(tag)
- method(attrs)
- return j - i
-
-
- def parse_endtag(self, data):
- if data[:2] != '</' or data[-1:] != '>':
- raise RuntimeError, 'unexpected call to parse_endtag'
-
- tag = string.lower(string.strip(data[2:-1]))
-
- try:
- method = getattr(self, 'end_' + tag)
- except AttributeError:
- self.unknown_endtag(tag)
- return None
-
- if self.stack and self.stack[-1] == tag:
- del self.stack[-1]
- else:
- print '*** Unbalanced </' + tag + '>'
- print '*** Stack:', self.stack
- found = None
- for i in range(len(self.stack)):
- pass
-
- if found != None:
- del self.stack[found:]
-
- method()
-
-
- def handle_charref(self, name):
-
- try:
- n = string.atoi(name)
- except string.atoi_error:
- self.unknown_charref(name)
- return None
-
- if not None if n <= n else n <= 255:
- self.unknown_charref(name)
- return None
-
- self.handle_data(chr(n))
-
- entitydefs = {
- 'lt': '<',
- 'gt': '>',
- 'amp': '&',
- 'quot': '"',
- 'apos': "'" }
-
- def handle_entityref(self, name):
- table = self.__class__.entitydefs
- name = string.lower(name)
- if table.has_key(name):
- self.handle_data(table[name])
- else:
- self.unknown_entityref(name)
- return None
-
-
- def handle_data(self, data):
- pass
-
-
- def handle_comment(self, data):
- pass
-
-
- def unknown_starttag(self, tag, attrs):
- pass
-
-
- def unknown_endtag(self, tag):
- pass
-
-
- def unknown_charref(self, ref):
- pass
-
-
- def unknown_entityref(self, ref):
- pass
-
-
-
- class TestSGML(SGMLParser):
-
- def handle_data(self, data):
- r = repr(data)
- if len(r) > 72:
- r = r[:35] + '...' + r[-35:]
-
- print 'data:', r
-
-
- def handle_comment(self, data):
- r = repr(data)
- if len(r) > 68:
- r = r[:32] + '...' + r[-32:]
-
- print 'comment:', r
-
-
- def unknown_starttag(self, tag, attrs):
- print 'start tag: <' + tag,
- for name, value in attrs:
- print name + '=' + '"' + value + '"',
-
- print '>'
-
-
- def unknown_endtag(self, tag):
- print 'end tag: </' + tag + '>'
-
-
- def unknown_entityref(self, ref):
- print '*** unknown entity ref: &' + ref + ';'
-
-
- def unknown_charref(self, ref):
- print '*** unknown char ref: ' + ref + ';'
-
-
-
- def test():
- file = 'test.html'
- f = open(file, 'r')
- x = TestSGML()
- while 1:
- line = f.readline()
- if not line:
- x.close()
- break
-
- x.feed(line)
-
-